package ar.utn.frgp.banco.front.action.operaciones;

import java.math.BigDecimal;
import java.util.List;

import ar.utn.frgp.banco.entity.Cuenta;
import ar.utn.frgp.banco.entity.enums.TipoCuenta;
import ar.utn.frgp.banco.exceptions.PersonalisedException;
import ar.utn.frgp.banco.front.action.EBAbstractAction;
import ar.utn.frgp.banco.service.GestionCuentasService;

public class DepositoAction extends EBAbstractAction{

	/**
	 * 
	 */
	private static final long serialVersionUID = 7695020273495972304L;

	/* (non-Javadoc)
	 * @see ar.utn.frgp.banco.front.action.EBAbstractAction#execute()
	 */
	
	private GestionCuentasService gestionCuentasService;
	
	private Long nroCuenta;
	
	private BigDecimal monto;

	private List<Cuenta> cuentas;
	
	@Override
	public String execute() throws PersonalisedException {
		// TODO Auto-generated method stub
		
		if (cuentas == null){
			cuentas = gestionCuentasService.obteneCuentas(getLoggedUser().getDni());
			
			if (cuentas.isEmpty()){
				return NONE;
			}
		}
		
		try {
			
			if (nroCuenta != null){
				
				Cuenta cuenta = gestionCuentasService.obtenerCuentaCompleta(nroCuenta);
				BigDecimal comision = new BigDecimal(0.9994);
				
				if(cuenta.getTipoCuenta() == TipoCuenta.CUENTA_CORRIENTE){
					monto = monto.multiply(comision);
				}
				
				gestionCuentasService.deposito(nroCuenta, monto);
				return SUCCESS;
			}
			
		} catch (Exception e) {		
			addActionError("Ha ocurrido un problema en la operacion");
			return INPUT;
		}
		
		return INPUT;
	}

	/**
	 * @return the gestionCuentasService
	 */
	public GestionCuentasService getGestionCuentasService() {
		return gestionCuentasService;
	}

	/**
	 * @param gestionCuentasService the gestionCuentasService to set
	 */
	public void setGestionCuentasService(GestionCuentasService gestionCuentasService) {
		this.gestionCuentasService = gestionCuentasService;
	}

	/**
	 * @return the nroCuenta
	 */
	public Long getNroCuenta() {
		return nroCuenta;
	}

	/**
	 * @param nroCuenta the nroCuenta to set
	 */
	public void setNroCuenta(Long nroCuenta) {
		this.nroCuenta = nroCuenta;
	}

	/**
	 * @return the monto
	 */
	public BigDecimal getMonto() {
		return monto;
	}

	/**
	 * @param monto the monto to set
	 */
	public void setMonto(BigDecimal monto) {
		this.monto = monto;
	}

	/**
	 * @return the cuentas
	 */
	public List<Cuenta> getCuentas() {
		return cuentas;
	}

	/**
	 * @param cuentas the cuentas to set
	 */
	public void setCuentas(List<Cuenta> cuentas) {
		this.cuentas = cuentas;
	}

}
